package com.example.service; // 定义包名，表示该类属于service包

import com.example.dao.UserDao; // 导入UserDao接口
import com.example.model.User; // 导入User实体类

import java.util.List; // 导入List集合接口

/**
 * 用户服务类
 * 封装用户相关的业务逻辑
 */
public class UserService { // 定义公共的UserService类
    
    private UserDao userDao; // 私有的UserDao实例，用于数据访问
    
    /**
     * 构造函数，注入UserDao依赖
     */
    public UserService(UserDao userDao) { // 构造函数，接收UserDao参数
        this.userDao = userDao; // 将传入的userDao赋值给实例变量
    } // 构造函数结束
    
    /**
     * 用户注册
     * @param username 用户名
     * @param password 密码
     * @param email 邮箱
     * @return 注册成功返回true，失败返回false
     */
    public boolean register(String username, String password, String email) { // 用户注册方法
        // 参数验证
        if (username == null || username.trim().isEmpty()) { // 检查用户名是否为空或只包含空白字符
            throw new IllegalArgumentException("用户名不能为空"); // 抛出非法参数异常
        } // if语句结束
        if (password == null || password.trim().isEmpty()) { // 检查密码是否为空或只包含空白字符
            throw new IllegalArgumentException("密码不能为空"); // 抛出非法参数异常
        } // if语句结束
        if (email == null || email.trim().isEmpty()) { // 检查邮箱是否为空或只包含空白字符
            throw new IllegalArgumentException("邮箱不能为空"); // 抛出非法参数异常
        } // if语句结束
        
        // 检查用户名是否已存在
        User existingUser = userDao.findByUsername(username); // 调用DAO方法查找用户名是否存在
        if (existingUser != null) { // 如果找到了已存在的用户
            return false; // 用户名已存在，返回false
        } // if语句结束
        
        // 创建新用户并注册
        User newUser = new User(username, password, email); // 创建新的User对象
        return userDao.register(newUser); // 调用DAO方法注册用户并返回结果
    } // register方法结束
    
    /**
     * 用户登录
     * @param username 用户名
     * @param password 密码
     * @return 登录成功返回true，失败返回false
     */
    public boolean login(String username, String password) { // 用户登录方法
        if (username == null || password == null) { // 检查用户名或密码是否为null
            return false; // 参数为null时返回false
        } // if语句结束
        
        User user = userDao.findByUsername(username); // 根据用户名查找用户
        if (user == null) { // 如果用户不存在
            return false; // 用户不存在，返回false
        } // if语句结束
        
        return password.equals(user.getPassword()); // 比较输入密码与数据库中的密码是否相等
    } // login方法结束
    
    /**
     * 根据用户名查找用户
     * @param username 用户名
     * @return 用户对象，如果不存在则返回null
     */
    public User findUserByUsername(String username) { // 根据用户名查找用户的方法
        if (username == null || username.trim().isEmpty()) { // 检查用户名是否为null或空字符串
            return null; // 参数无效时返回null
        } // if语句结束
        return userDao.findByUsername(username); // 调用DAO方法查找用户并返回结果
    } // findUserByUsername方法结束
    
    /**
     * 获取所有用户
     * @return 用户列表
     */
    public List<User> getAllUsers() { // 获取所有用户的方法
        return userDao.findAll(); // 调用DAO方法获取所有用户并返回列表
    } // getAllUsers方法结束
    
    /**
     * 根据ID查找用户
     * @param id 用户ID
     * @return 用户对象，如果不存在则返回null
     */
    public User findUserById(int id) { // 根据ID查找用户的方法
        if (id <= 0) { // 检查ID是否为有效的正整数
            return null; // ID无效时返回null
        } // if语句结束
        return userDao.findById(id); // 调用DAO方法根据ID查找用户并返回结果
    } // findUserById方法结束
    
    /**
     * 更新用户信息
     * @param user 用户对象
     * @return 更新成功返回true，失败返回false
     */
    public boolean updateUser(User user) { // 更新用户信息的方法
        if (user == null || user.getId() <= 0) { // 检查用户对象是否为null或ID是否有效
            return false; // 参数无效时返回false
        } // if语句结束
        
        // 检查用户是否存在
        User existingUser = userDao.findById(user.getId()); // 根据ID查找现有用户
        if (existingUser == null) { // 如果用户不存在
            return false; // 用户不存在时返回false
        } // if语句结束
        
        // 如果用户名发生变化，检查新用户名是否已被其他用户使用
        if (!existingUser.getUsername().equals(user.getUsername())) { // 比较现有用户名与新用户名是否不同
            User userWithSameName = userDao.findByUsername(user.getUsername()); // 查找是否有其他用户使用相同用户名
            if (userWithSameName != null && userWithSameName.getId() != user.getId()) { // 如果找到同名用户且不是当前用户
                return false; // 用户名已被其他用户使用，返回false
            } // if语句结束
        } // if语句结束
        
        return userDao.update(user); // 调用DAO方法更新用户信息并返回结果
    } // updateUser方法结束
    
    /**
     * 删除用户
     * @param id 用户ID
     * @return 删除成功返回true，失败返回false
     */
    public boolean deleteUser(int id) { // 删除用户的方法
        if (id <= 0) { // 检查ID是否为有效的正整数
            return false; // ID无效时返回false
        } // if语句结束
        
        // 检查用户是否存在
        User existingUser = userDao.findById(id); // 根据ID查找用户是否存在
        if (existingUser == null) { // 如果用户不存在
            return false; // 用户不存在时返回false
        } // if语句结束
        
        return userDao.delete(id); // 调用DAO方法删除用户并返回结果
    } // deleteUser方法结束
    
    /**
     * 验证邮箱格式
     * @param email 邮箱地址
     * @return 格式正确返回true，否则返回false
     */
    public boolean isValidEmail(String email) { // 验证邮箱格式的方法
        if (email == null || email.trim().isEmpty()) { // 检查邮箱是否为null或空字符串
            return false; // 邮箱为空时返回false
        } // if语句结束
        
        // 简单的邮箱格式验证
        String emailRegex = "^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$"; // 定义邮箱格式的正则表达式
        return email.matches(emailRegex); // 使用正则表达式验证邮箱格式并返回结果
    } // isValidEmail方法结束
} // UserService类结束